<?php
// +----------------------------------------------------------------------
// | 模型
// +----------------------------------------------------------------------
declare(strict_types=1);

namespace app\model;

use think\Model;
use think\db\Query;

/**
 * 系统角色模型
 *
 * Class SystemRolesModel
 * @package app\model
 * @OA\Schema(
 *   schema="GetSystemRoles",
 *   type="object",
 *   @OA\Property(description="ID", property="id", type="integer", example=1),
 *   @OA\Property(description="角色名", property="roleName", type="string", example="测试员"),
 *   @OA\Property(description="角色标识", property="code", type="string", example="testing"),
 *   @OA\Property(
 *     description="菜单权限",
 *     property="permissions",
 *     type="array",
 *     items={@OA\Items(type="string")},
 *     example={"System", "system:btn:add"}
 *   ),
 *   @OA\Property(description="备注", property="remark", type="string", example="备注信息"),
 *   @OA\Property(description="排序", property="sort", type="integer", example=10),
 *   @OA\Property(description="状态", property="status", type="boolean", example=true),
 *   @OA\Property(description="创建时间", property="createTime", type="string", format="date-time", example="2024-01-01T12:00:00Z"),
 *   @OA\Property(description="更新时间", property="updateTime", type="string", format="date-time", example="2024-01-02T12:00:00Z")
 * )
 * @OA\Schema(
 *   schema="SetSystemRoles",
 *   type="object",
 *   @OA\Property(description="角色名", property="roleName", type="string", example="测试员"),
 *   @OA\Property(description="角色标识", property="code", type="string", example="testing"),
 *   @OA\Property(
 *     description="菜单权限",
 *     property="permissions",
 *     type="array",
 *     items={@OA\Items(type="string")},
 *     example={"System", "system:btn:add"}
 *   ),
 *   @OA\Property(description="备注", property="remark", type="string", example="备注信息"),
 *   @OA\Property(description="排序", property="sort", type="integer", example=10),
 *   @OA\Property(description="状态", property="status", type="boolean", example=true)
 * )
 */
class SystemRolesModel extends Model
{
    // 设置表名
    protected $name = 'system_roles';
    // 设置字段信息
    protected $schema = [
        'id'           => 'int',
        // 角色名
        'role_name'    => 'string',
        // 角色标识
        'code'         => 'string',
        // 菜单权限
        'permissions'  => 'json',
        // 备注
        'remark'       => 'string',
        // 排序
        'sort'         => 'int',
        // 状态
        'status'       => 'bool',
        // 创建时间
        'create_time'  => 'datetime',
        // 更新时间
        'update_time'  => 'datetime',
    ];
    // 设置json类型字段
    protected $json = ['permissions'];
    // 设置JSON数据返回数组
    protected $jsonAssoc = true;
    // 模型数据不区分大小写
    protected $strict = false;
    // 数据转换为驼峰命名
    protected $convertNameToCamel = true;
    // 移除关联字段
    protected $hidden = ['pivot'];

    /**
     * 获取完整数据（包含关联与排序）
     * 
     * @return Query
     */
    static public function queryOrder()
    {
        return self::order([
            'sort' => 'asc',
            'id'   => 'asc'
        ]);
    }

    /**
     * 搜索器 - 角色名
     * 
     * @param Query $query 请求
     * @param mixed $value 字段值
     * @param array $data 完整数据
     * @return
     */
    public function searchRoleNameAttr($query, $value, $data)
    {
        $query->where('role_name', 'like', '%' . $value . '%');
    }

    /**
     * 搜索器 - 角色标识
     * 
     * @param Query $query 请求
     * @param mixed $value 字段值
     * @param array $data 完整数据
     * @return
     */
    public function searchCodeAttr($query, $value, $data)
    {
        $query->where('code', 'like', '%' . $value . '%');
    }

    /**
     * 搜索器 - 备注
     * 
     * @param Query $query 请求
     * @param mixed $value 字段值
     * @param array $data 完整数据
     * @return
     */
    public function searchRemarkAttr($query, $value, $data)
    {
        $query->where('remark', 'like', '%' . $value . '%');
    }

    /**
     * 搜索器 - 状态
     * 
     * @param Query $query 请求
     * @param mixed $value 字段值
     * @param array $data 完整数据
     * @return
     */
    public function searchStatusAttr($query, $value, $data)
    {
        $query->where('status', !!$value);
    }

    /**
     * 获取器 - 状态
     *
     * @param mixed $value
     * @return array
     */
    public function getStatusAttr($value)
    {
        return !!$value;
    }

    /**
     * 修改器 - 状态
     *
     * @param mixed $value
     * @return int
     */
    public function setStatusAttr($value)
    {
        return !!$value;
    }
}
